package ar.edu.itba.it.cg.grupo01.api.shape;

import java.util.Collection;

import javax.vecmath.Matrix4f;
import javax.vecmath.Point2f;
import javax.vecmath.Point3f;
import javax.vecmath.Vector3f;

import ar.edu.itba.it.cg.grupo01.api.Intersectable;
import ar.edu.itba.it.cg.grupo01.impl.shape.AABB;
import ar.edu.itba.it.cg.grupo01.impl.shape.shader.Shader;

/**
 * Interface that defines shape operations
 * 
 */
public interface Shape extends Intersectable {

	Collection<Point3f> getVertices();

	Shape applyTransformation(Matrix4f tmat);
	
	Shape applyTransformation();

	Shape getTransformedShape();

	boolean containedInAABB(AABB box);

	Point3f getMaxXYZ();

	Point3f getMinXYZ();

	Point2f getUVCoordinates(Point3f point);
	
	Point3f getUVWCoordinates(Point3f point);
	
	/**
	 * Returns a number greater than 1 if it is a mesh
	 * 
	 * @return amount of shapes in this shape
	 */
	int getShapeCount();

	Vector3f getNormal(Point3f point);

	boolean isLight();

	void setTransformation(Matrix4f transform);
	
	Shader getShader();

	void setShader(Shader shader);
}
